<?php

namespace app\admin\model;
use think\Model;
use think\Db;

class OcationClassCourse extends Model
{
    // 表名
    public $name = 'ocation_class_course';
    public $prefix_new = 'fa_';
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'datetime';

    // 定义时间戳字段名
    protected $createTime = 'create_time';
    protected $updateTime = 'update_time';
    public $data;
    
    /**
     * 批量更新教学点课程关联记录
     * @param array $data 要更新的数据数组，每个元素必须包含id
     * @return bool 是否更新成功
     */
    public static function batchUpdate($data)
    {
        if (empty($data)) {
            return true;
        }
        
        try {
            foreach ($data as $item) {
                if (empty($item['id'])) {
                    continue;
                }
                
                $id = $item['id'];
                unset($item['id']); // 移除ID，避免更新主键
                
                // 确保更新时间字段正确
                if (!isset($item['update_time'])) {
                    $item['update_time'] = date('Y-m-d H:i:s');
                }
                
                // 更新记录
                Db::name('ocation_class_course')->where('id', $id)->update($item);
            }
            return true;
        } catch (\Exception $e) {
            // 记录错误日志
            \think\Log::error('批量更新教学点课程关联记录失败: ' . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 批量插入新的教学点课程关联记录
     * @param array $data 要插入的数据数组
     * @return array|bool 成功返回插入的ID数组，失败返回false
     */
    public static function batchInsert($data)
    {
        if (empty($data)) {
            return [];
        }
        
        try {
            $insertIds = [];
            $now = date('Y-m-d H:i:s');
            
            foreach ($data as &$item) {
                // 确保时间字段正确
                if (!isset($item['create_time'])) {
                    $item['create_time'] = $now;
                }
                if (!isset($item['update_time'])) {
                    $item['update_time'] = $now;
                }
                
                // 插入记录并获取ID
                $id = Db::name('ocation_class_course')->insertGetId($item);
                if ($id) {
                    $insertIds[] = $id;
                }
            }
            
            return $insertIds;
        } catch (\Exception $e) {
            // 记录错误日志
            \think\Log::error('批量插入教学点课程关联记录失败: ' . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 删除不再需要的关联记录
     * @param array $ids 要删除的记录ID数组
     * @return bool 是否删除成功
     */
    public static function batchDelete($ids)
    {
        if (empty($ids)) {
            return true;
        }
        
        try {
            // 删除指定ID的记录
            Db::name('ocation_class_course')->whereIn('id', $ids)->delete();
            return true;
        } catch (\Exception $e) {
            // 记录错误日志
            \think\Log::error('删除教学点课程关联记录失败: ' . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 根据教学点课程ID删除所有关联记录
     * @param int $ocationClassId 教学点课程ID
     * @return bool 是否删除成功
     */
    public static function deleteByOcationClassId($ocationClassId)
    {
        if (empty($ocationClassId)) {
            return true;
        }
        
        try {
            // 删除指定教学点课程ID的所有关联记录
            Db::name('ocation_class_course')->where('ocation_class_id', $ocationClassId)->delete();
            return true;
        } catch (\Exception $e) {
            // 记录错误日志
            \think\Log::error('删除教学点课程关联记录失败: ' . $e->getMessage());
            return false;
        }
    }

    /**
     * 关联教学点班级
     */
    public function ocationClass()
    {
        return $this->belongsTo('OcationClass', 'ocation_class_id', 'id');
    }

    /**
     * 关联原班级（课程）
     */
    public function class()
    {
        return $this->belongsTo('Classes', 'class_id', 'id');
    }
    
    /**
     * 批量更新教学点课程关联记录
     * @param array $data 要更新的数据数组，每个元素必须包含id字段
     * @return bool
     */
    public static function batchUpdate($data)
    {
        if (empty($data)) {
            return true;
        }
        
        try {
            foreach ($data as $item) {
                if (!isset($item['id'])) {
                    continue;
                }
                
                $id = $item['id'];
                $updateData = $item;
                unset($updateData['id']); // 移除ID字段，避免更新主键
                
                // 添加更新时间
                $updateData['update_time'] = date('Y-m-d H:i:s');
                
                // 更新记录
                Db::name('ocation_class_course')->where('id', $id)->update($updateData);
            }
            
            return true;
        } catch (\Exception $e) {
            // 记录错误日志
            \think\Log::error('批量更新教学点课程关联记录失败：' . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 批量插入教学点课程关联记录
     * @param array $data 要插入的数据数组
     * @return array|bool 成功返回插入的ID数组，失败返回false
     */
    public static function batchInsert($data)
    {
        if (empty($data)) {
            return [];
        }
        
        try {
            $insertIds = [];
            
            foreach ($data as $item) {
                // 添加创建和更新时间
                $item['create_time'] = date('Y-m-d H:i:s');
                $item['update_time'] = date('Y-m-d H:i:s');
                
                // 插入记录
                $id = Db::name('ocation_class_course')->insertGetId($item);
                if ($id) {
                    $insertIds[] = $id;
                }
            }
            
            return $insertIds;
        } catch (\Exception $e) {
            // 记录错误日志
            \think\Log::error('批量插入教学点课程关联记录失败：' . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 批量删除教学点课程关联记录
     * @param array $ids 要删除的ID数组
     * @return bool
     */
    public static function batchDelete($ids)
    {
        if (empty($ids)) {
            return true;
        }
        
        try {
            // 删除记录
            Db::name('ocation_class_course')->whereIn('id', $ids)->delete();
            return true;
        } catch (\Exception $e) {
            // 记录错误日志
            \think\Log::error('批量删除教学点课程关联记录失败：' . $e->getMessage());
            return false;
        }
    }

    /**
     * 批量更新教学点课程关联关系（根据教学点课程ID）
     * @param array $data 课程关联数据
     * @param int $ocationClassId 教学点课程ID
     * @return bool 是否成功
     */
    public function batchUpdateCourses($data, $ocationClassId)
    {
        try {
            Db::startTrans();

            // 1. 获取现有的课程关联记录
            $existingCourses = Db::name('ocation_class_course')
                ->where('ocation_class_id', $ocationClassId)
                ->select();

            $existingCourseMap = [];
            foreach ($existingCourses as $course) {
                $existingCourseMap[$course['class_id']] = $course;
            }

            // 2. 从数据中提取班级ID
            $newClassIds = [];
            foreach ($data as $item) {
                if (!empty($item['class_id'])) {
                    $newClassIds[] = $item['class_id'];
                }
            }

            $newClassIds = array_unique($newClassIds);

            // 3. 准备更新、新增和删除的数据
            $toUpdate = [];
            $toInsert = [];
            $toDelete = [];

            // 处理需要新增或更新的关联
            foreach ($newClassIds as $classId) {
                if (isset($existingCourseMap[$classId])) {
                    // 更新现有记录
                    $toUpdate[] = [
                        'id' => $existingCourseMap[$classId]['id'],
                        'status' => 1,
                        'update_time' => date('Y-m-d H:i:s')
                    ];
                    unset($existingCourseMap[$classId]);
                } else {
                    // 新增记录
                    $toInsert[] = [
                        'ocation_class_id' => $ocationClassId,
                        'class_id' => $classId,
                        'status' => 1,
                        'create_time' => date('Y-m-d H:i:s'),
                        'update_time' => date('Y-m-d H:i:s')
                    ];
                }
            }

            // 剩余的记录需要删除（设置状态为0）
            foreach ($existingCourseMap as $course) {
                $toDelete[] = $course['id'];
            }

            // 4. 执行批量操作
            if (!empty($toUpdate)) {
                foreach ($toUpdate as $updateData) {
                    Db::name('ocation_class_course')
                        ->where('id', $updateData['id'])
                        ->update($updateData);
                }
            }

            if (!empty($toInsert)) {
                Db::name('ocation_class_course')->insertAll($toInsert);
            }

            if (!empty($toDelete)) {
                Db::name('ocation_class_course')
                    ->where('id', 'in', $toDelete)
                    ->update(['status' => 0, 'update_time' => date('Y-m-d H:i:s')]);
            }

            Db::commit();
            return true;

        } catch (\Exception $e) {
            Db::rollback();
            file_put_contents($_SERVER["DOCUMENT_ROOT"]."/../runtime/log/ocation_class_course_batch_update_error.log",
                date('Y-m-d H:i:s') . " - " . $e->getMessage() . "\n", FILE_APPEND);
            return false;
        }
    }
}